/**
 * @param {string[]} wordlist
 * @param {string[]} queries
 * @return {string[]}
 */
var spellchecker = function (wordlist, queries) {
  // 创建三个映射来存储不同匹配规则的单词
  const exactMap = new Set(); // 精确匹配（区分大小写）
  const caseInsensitiveMap = new Map(); // 大小写不敏感匹配
  const vowelInsensitiveMap = new Map(); // 元音不敏感匹配（元音可替换）

  // 辅助函数：将单词中的元音替换为*
  const replaceVowels = (word) => {
    const vowels = new Set(["a", "e", "i", "o", "u"]);
    return word
      .toLowerCase()
      .split("")
      .map((c) => (vowels.has(c) ? "*" : c))
      .join("");
  };

  // 构建映射
  for (const word of wordlist) {
    // 精确匹配
    exactMap.add(word);

    // 大小写不敏感匹配（保留第一个出现的单词）
    const lowerWord = word.toLowerCase();
    if (!caseInsensitiveMap.has(lowerWord)) {
      caseInsensitiveMap.set(lowerWord, word);
    }

    // 元音不敏感匹配（保留第一个出现的单词）
    const vowelPattern = replaceVowels(word);
    if (!vowelInsensitiveMap.has(vowelPattern)) {
      vowelInsensitiveMap.set(vowelPattern, word);
    }
  }

  // 处理每个查询
  const result = [];
  for (const query of queries) {
    // 1. 检查精确匹配
    if (exactMap.has(query)) {
      result.push(query);
      continue;
    }

    // 2. 检查大小写不敏感匹配
    const lowerQuery = query.toLowerCase();
    if (caseInsensitiveMap.has(lowerQuery)) {
      result.push(caseInsensitiveMap.get(lowerQuery));
      continue;
    }

    // 3. 检查元音不敏感匹配
    const queryVowelPattern = replaceVowels(query);
    if (vowelInsensitiveMap.has(queryVowelPattern)) {
      result.push(vowelInsensitiveMap.get(queryVowelPattern));
      continue;
    }

    // 无匹配项
    result.push("");
  }

  return result;
};
